public class Book {

    // 当类模板加载到方法区，静态变量就初始化，然后加载到静态方法
    // 此时没有实例变量，也没有实例方法
    // 当使用new创建对象的时候，在内存分配空间，然后初始化示例变量，加载实例方法
    String name;
    // 类的属性 静态变量 类的所有对象共享的
    // 没有static 修饰的变量 属于 实例变量 归属于对象，各个对象独享的
    static String publish = "开发喵出版社";
    public int size;
    public String type;
    public String author;

    // 实例 代码块 创建对象的时候会执行 因此创建多少次对象就会执行多少次
    {
        System.out.println("实例代码块");
    }

    // 静态 代码块 类第一个被加载的时候执行 加载所有的静态内容 静态变量 静态方法 静态代码块
    static {
        System.out.println("静态代码块1");
    }

    static {
        System.out.println("静态代码块2");
    }

    public Book() {
    }

    public Book(String name, int size, String type, String author) {
        this.name = name;
        this.size = size;
        this.type = type;
        this.author = author;
    }

    // 没有 static 修饰的方法 实例方法
    public void info() {
        printPublish(); // 能创建对象，说明类已经加载到了，类加载到了 静态方法和静态变量都存在了
        // 实例方法中可以访问 静态变量
        System.out.println(name + "出版社：" + publish + "，类别" + type + "，页码：" + size + "，作者：" + author);
    }

    // static 修饰的方法 都属于类  静态方法
    public static void printPublish() {
        // System.out.println(name); // 错误调用 此时还没有实例变量
        // info();  // 错误调用 此时实例方法还没有
        // 正确的在静态方法中调用实例方法
//        Book book = new Book();
//        book.info();
        System.out.println("出版社是：" + publish);
    }
}
